<

OverlayEntries と Route の再構築の最適化

まとめ

この最適化により、ルート遷移のパフォーマンスが向上します。 ただし、それにより、失われた呼び出しが見つかる可能性がありますsetStateあなたのアプリで。

コンテクスト

この変更の前は、OverlayEntryいつ再構築するか 新しい不透明なエントリがその上に追加されたか、その上から削除されました。 これらの再構築はトリガーされなかったため不要でした 影響を受けた人の状態の変化によってOverlayEntry。これ 重大な変更により、追加と削除の処理方法が最適化されました。OverlayEntrys、不要な再構築を削除します。 パフォーマンスを向上させるために。

以来、Navigatorそれぞれを内部的に配置しますRouteOverlayEntryこの変更は以下にも適用されますRouteトランジション: 不透明の場合Route上に押し付けられるか、別の上から取り外されるRouteRoute不透明の下にあるRoute不必要に再構築することがなくなりました。

変更内容の説明

ほとんどの場合、この変更にはコードを変更する必要はありません。 ただし、アプリが誤って暗黙的な依存関係に依存していた場合、 リビルドすると問題が発生する可能性がありますが、ラップすることで解決できます。 の状態変化setState電話。

さらに、この変更により、形状がわずかに変更されました。 ウィジェット ツリー: この変更前は、 のOverlayEntryに包まれていましたStackウィジェット。 明示的なStackウィジェットはウィジェット階層から削除されました。

移行ガイド

Flutter バージョンにアップグレードした後に問題が発生した場合 この変更が含まれている場合は、コードを監査して、setState。以下の例では、戻り値を代入します。Navigator.pushNamedbuttonLabelは 暗黙的に状態を変更するため、それをラップする必要があります。 明示的なsetState電話。

移行前のコード:

class FooState extends State<Foo> {
  String buttonLabel = 'Click Me';
  @override
  Widget build(BuildContext context) {
    return ElevatedButton(
      onPressed: () async {
        // Illegal state modification that should be wrapped in setState.
        buttonLabel = await Navigator.pushNamed(context, '/bar');
      },
      child: Text(buttonLabel),
    );
  }
}

移行後のコード:

class FooState extends State<Foo> {
  String buttonLabel = 'Click Me';
  @override
  Widget build(BuildContext context) {
    return ElevatedButton(
      onPressed: () async {
        final newLabel = await Navigator.pushNamed(context, '/bar');
        setState(() {
          buttonLabel = newLabel;
        });
      },
      child: Text(buttonLabel),
    );
  }
}

タイムライン

リリースされたバージョン: 1.16.3
安定版リリース: 1.17

参考文献

API ドキュメント:

  • setState
  • OverlayEntry
  • Overlay
  • Navigator
  • Route
  • OverlayRoute

関連する問題:

  • 問題 45797

関連する PR:

  • 新しい不透明なルートが上に押し込まれたときにルートを再構築しない
  • リランド「新しい不透明なルートが上に押し込まれた場合、ルートを再構築しないでください」